9052. Выстрел по мишени

 

Агент Джонни Инглиш решил попрактиковаться в стрельбе. Для этого он решил сделать ровно n выстрелов. Его пистолет имеет магазин на m патронов, который, разумеется, изначально не заряжен.

Джонни Инглиш может полностью перезарядить свой пистолет за a секунд, или доложить в магазин один патрон за b секунд. Один выстрел занимает ровно одну секунду. Помогите ему посчитать, за какое минимальное время Агент Джонни Инглиш сможет совершить ровно n выстрелов. Разумеется, он не может выстрелить из пустого пистолета и не может положить новый патрон в уже полный магазин.

 

Вход. В первой строке находятся четыре целых числа n, m, a и b (1 ≤ n, m, a, b ≤ 104) – число выстрелов, которое необходимо сделать, размер магазина пистолета, время полной перезарядки магазина и время зарядки одного патрона.

 

Выход. Выведите одно число – минимальное время, которое понадобится агенту, чтобы совершить ровно n выстрелов.

 

Пример входа

Пример выхода

3 2 1 1

5

 

 

РЕШЕНИЕ

математика

 

Анализ алгоритма

Магазин пистолета содержит на m патронов. Доложить в магазин один патрон можно за b секунд. Если m * b < a, то положим a = m * b. Теперь a содержит минимальное время перезарядки всего пистолета.

Для совершения n выстрелов при размере магазина в m патронов, придется:

·        n / m раз полностью перезарядить магазин, что можно совершить за (n / m) * a секунд;

·        для выполнения оставшихся n % m выстрелов можно или один раз перезарядить магазин за a секунд, или положить в магазин патронов за (n % m) * b секунд. Совершаем ту операцию, которая требует меньшего времени. На нее уйдет min(a, (n % m) * b) секунд.

·        совершить n выстрелов можно за n секунд;

 

Итого общее время тренировки составит

(n / m) * a + min(a, (n % m) * b) + n

секунд.

 

Пример

Пример содержит следующие входные данные: n = 3, m = 2, a = 1, b = 1.

Минимальное время перезарядки всего пистолета составит

a = min(a, m * b) = min(1, 2 * 1) = 1

Минимальное время совершения n выстрелов равно

(n / m) * a + min(a, (n % m) * b) + n =

(3 / 2) * 1 + min(1, (3 % 2) * 1) + 3 =

1 + 1 + 3 = 5

 

Реализация алгоритма

Читаем входные данные.

 

scanf("%lld %lld %lld %lld", &n, &m, &a, &b);

 

Вычисляем минимальное время a полной перезарядки пистолета.

 

a = min(a, m * b);

 

Вычисляем минимальное время совершения n выстрелов.

 

res = (n / m) * a + min(a, (n % m) * b) + n;

 

Выводим ответ.

 

printf("%lld\n", res);